package com.hyper_yang._03_designpatterns;

/**
 * illustate: 这是对于 设计模式的一个总览和分析
 * @Author Yang
 * @Email hyper_y@163.com
 */
public class Illustrate {
/*
    设计模式: Design Patterns
        精髓: 1、对接口编程而不是对实现编程
             2、优先使用对象组合而不是继承
        基石: ·封装 ·继承 ·多态 、
             ·顺序 ·判断 ·循环
        是思想，灵活运用 >> 死记代码
 */

// 三种类型:
/*
创建型模式: Creational Pattrens
    · 单例 (Singleton)模式
    · 原型 (Prototype)模式
    · 工厂方法 (FactoryMethod)模式
    · 抽象工厂 (AbastractFactory)模式
    · 建造者 (Builder)模式
结构型模式: Structural Patterns
    · 代理 (proxy)模式
    · 适配器 (Adapter)模式
    · 桥接 (Bridge)模式
    · 装饰 (Decorator)模式
    · 外观 (Facade)模式
    · 享元 (Flyweight)模式
    · 组合 (Composite)模式
    · 过滤器模式 (Filter Pattern)
行为型模式: Behavioral Patterns
    · 模板方法 (Template Method)模式
    · 策略 (Strategy)模式
    · 命令 (Command)模式
    · 职责链 (Chain of Responsibility)模式
    · 状态 (State)模式
    · 观察者 (Observer)模式
    · 中介者 (Mediator)模式
    · 迭代器 (Iterator)模式
    · 访问者 (Visitor)模式
    · 备忘录 (Memento)模式
    · 解释器 (Interpreter)模式
 */

// 七大原则:
/*
· 开闭原则 Open Closed Principle, OCP 【拓展新类而不是修改旧类】
    · 软件实体应当对拓展开放，对修改关闭。 Software entities should be open for extension,but closed for modification
· 里氏替换原则 Liskov Substitution Principle, LSP 【继承父类而不去改变父类】
    · 继承必须确保超类所拥有的性质在子类中仍然成立。 Inheritance should ensure that any property proved about supertype objects also holds for subtype objects
· 依赖倒置原则 Dependence Inversion Principle, DIP 【面向接口编程，而不是面向实现类】
    · 高层模块不应该依赖底层模块，两者都应该依赖其抽象；High level modules should not depend upon low level modules, both should depend upon abstractions
    · 抽象不应该依赖细节，细节应该依赖抽象。 Abstractions should not depend upon details, details should depend upon abstractions
· 单一职责原则 Single Responsibility Principle, SRP 【每个类只负责自己的事情，而不是变成万能的】
    · 一个类应该有且仅有一个引起他变化的原因，否则该类应该被拆分 There should never be more than one reason for a class to change -- 细粒度
· 接口隔离原则 Interface Segregation Principle, ISP 【每个类建立自己的专用接口，而不是建立万能接口】
    · 一个类对另一个类的依赖应该建立在最小的接口上 The dependency of one class to another one should depend on the smallest possible interface
· 迪米特法则 Law of Demeter, LoD 【无需直接交互的两个类，如果需要交互，使用中间者】
    · 最小知识原则 Least Knowledge Principle, LKP
    · 只与你的直接朋友交谈，不跟 "陌生人"说话 Talk only to your immediate friends and not to strangers
    -- 过度使用迪米特法则会使系统产生大量的中介类，从而增加系统的复杂性，使模块之间的通信效率降低
· 合成复用原则 Composite Reuse Principle, CRP 【优先组合、其次继承】
    · 组合、聚合复用原则 Compostion、Aggregate Reuse Principle, CARP
    · 软件复用时，要尽量先使用组合或者聚合等关联关系来实现，其次才考虑使用继承关系来实现。
 */
}
/*
注意点:
单一职责原则 (SRP)：关注的是类的内聚性。一个类应该只有一个引起它变化的原因。换句话说，一个类只应该负责一件事。
接口隔离原则 (ISP)：关注的是接口的粒度。不应该强迫客户（调用方）依赖于他们不使用的方法。换句话说，应该把大的、臃肿的接口拆分成更小的、更具体的接口。
 */